﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace iBank.Logica
{
    class Cuenta
    {
        private string numero;
        private string tipo;
        private long saldo;
        private List<Transaccion> movimientos;

        //-------------------------Getter & Setters-------------------------------//
        public string Numero
        {
            get { return numero; }
            set { numero = value; }
        }
        
        public string Tipo
        {
            get { return tipo; }
            set { tipo = value; }
        }
        
        public long Saldo
        {
            get { return saldo; }
            set { saldo = value; }
        }

        internal List<Transaccion> Movimientos
        {
            get { return movimientos; }
            set { movimientos = value; }
        }
        //---------------------fin Getter & Setters-------------------------------//

        //Metodo para buscar en la lista raiz una cuenta, retorna null si no encuentra la cuenta
        public static Cuenta buscarCuenta(string numero,List<Persona> listaPersonas)
        {
            foreach(Persona each in listaPersonas)
            {
                foreach(Tarjeta tarjeta in each.ListaTarjetas)
                {
                    foreach (Cuenta cuenta in tarjeta.ListaCuentas)
                    {
                        if (numero.Equals(cuenta.Numero))
                            return cuenta;
                    }
                }
            }

            return null;
        }

        //Metodo para buscar en la lista raiz una cuenta segun el index, retorna null si no encuentra la cuenta
        public static Cuenta buscarCuentaIndex(string numero,string tarjeta_num, List<Persona> listaPersonas)
        {
            foreach (Persona each in listaPersonas)
            {
                foreach (Tarjeta tarjeta in each.ListaTarjetas)
                {
                    if (tarjeta.Numero.Equals(tarjeta_num))
                    {
                        return tarjeta.ListaCuentas[int.Parse(numero)]; Console.WriteLine(tarjeta.ListaCuentas[int.Parse(numero)]);
                    }
                }
            }

            return null;
        }

        //Metodo que realiza un deposito dada una cuenta y una tarjeta
        public static List<Persona> RealizarDeposito(string numero, long deposito, List<Persona> listaPersonas)
        {
           
            foreach (Persona each in listaPersonas)
            {
                foreach (Tarjeta tarjeta in each.ListaTarjetas)
                {
                    
                    foreach (Cuenta cuenta in tarjeta.ListaCuentas)
                    {
                        if (numero.Equals(cuenta.Numero))
                        {
                            cuenta.Saldo = cuenta.Saldo + deposito;
                            return listaPersonas;
                        } 
                    }
                }
            }

            return null;
        }

        //Metodo que realiza un retiro dada una cuenta y una tarjeta, si no se dispone de fondos suficientes se arroja NULL
        public static List<Persona> RealizarRetiro(string numero, long retiro, List<Persona> listaPersonas)
        {
            foreach (Persona each in listaPersonas)
            {
                foreach (Tarjeta tarjeta in each.ListaTarjetas)
                {
                    foreach (Cuenta cuenta in tarjeta.ListaCuentas)
                    {
                        if (numero.Equals(cuenta.Numero))
                        {
                            if (cuenta.Saldo >= retiro)
                            {
                                cuenta.Saldo = cuenta.Saldo - retiro;
                                return listaPersonas;
                            }
                            else
                                return null;
                        }
                    }
                }
            }

            return null;
        }

    }
}
